/**
 * 适配器模式
 *
 * target 具体要使用的类，可以是一个抽象类或接口，也可以是具体类。
 * Adapter 适配器可以调用另一个接口，作为一个转换器，对Adaptee和Target进行适配，适配器类是适配器模式的核心，在对象适配器中，它通过继承Target并关联一个Adaptee对象使二者产生联系。
 * Adaptee  适配者即被适配的角色，它定义了一个已经存在的接口，这个接口需要适配，适配者类一般是一个具体类，包含了客户希望使用的业务方法，在某些情况下可能没有适配者类的源代码。
 *
 * 举个例子
 * 假如要有一台macbook 要使用 要使用u盘，那么时就需要一个适配器（macbook没有usb 接口），此时
 * target: U盘（要使用u盘）
 * Adapter: 中间的一个转接线
 * adaptee: makbook 上面的type-c接口  （要使用）
 *
 *
 * 优点：
 * 1、将目标类和适配者类解耦，通过引入一个适配器类来重用现有的适配者类，无需修改原有结构
 * 2、增加了类的透明性和复用性，将具体的业务实现过程封装在适配者类中，对于客户端类而言是透明的，而且提高了适配者的复用性，同一个适配者类可以在多个不同的系统中复用。
 * 3、灵活性和扩展性都非常好，通过使用配置文件，可以很方便地更换适配器，也可以在不修改原有代码的基础上增加新的适配器类，完全符合“开闭原则”。
 *
 * 缺点：
 * 1、对于Java、C#等不支持多重类继承的语言，一次最多只能适配一个适配者类，不能同时适配多个适配者；
 * 2、适配者类不能为最终类，如在Java中不能为final类，C#中不能为sealed类；
 * 3、在Java、C#等语言中，类适配器模式中的目标抽象类只能为接口，不能为类，其使用有一定的局限性。
 * 对象适配器模式的缺点如下：
 *
 * 与类适配器模式相比，要在适配器中置换适配者类的某些方法比较麻烦。如果一定要置换掉适配者类的一个或多个方法，可以先做一个适配者类的子类，将适配者类的方法置换掉，然后再把适配者类的子类当做真正的适配者进行适配，实现过程较为复杂。
 *
 *
 */
package com.young.design.pattern.adapter;